Ví dụ Code cave

Ví dụ sau đây nói về use case đơn giản nhất của code cave: chèn lệnh vào đó và làm sao để nó thực thi trước khi phần lệnh chính của chương trình được thực thi.

Giả sử cho một file thực thi được thể hiện bằng mã x86, cùng với một vùng "code cave", đơn giản như sau:

; Giả định chương trình sử dụng thư viện C và chạy 64 bitglobal  mainextern  putssection .textmain:    ; fastcall    mov     rdi, message    ; đưa địa chỉ của chuỗi văn bản vào tham số thứ nhất    call    puts            ; puts(message)    ret        ; Giả sử ở đây có một vùng code cave khá lớn sau khi biên dịch chương trình    message:    db      "Hello world", 0

Biên dịch ra file thực thi và chạy nó, trên màn hình dòng lệnh sẽ hiển thị dòng chữ "Hello world".

Người ta có thể chỉnh sửa trực tiếp vào file thực thi này, thông qua các công cụ disassembly, theo cách như sau:

  • Tìm code cave trong file thực thi rồi viết code bổ sung vào đó
  • Chèn code vào đầu phần code chính để chuyển hướng luồng chạy xuống code cave
  • Chèn code vào cuối phần code trong code cave để chuyển hướng về lại phần code chính

Có thể sử dụng các lệnh chỉ thị CALL và RET để đơn giản bớt công việc này. Chẳng hạn như sau:

global  mainextern  putssection .textmain:    call    payload         ; chuyển hướng xuống code cave (ghi đè lệnh chỉ thị có sẵn)    call    puts    ret    ; Bắt đầu code caveinject_message:    db      "Injected", 0payload:    mov     rdi, inject_message    call    puts    mov     rdi, message    ; khôi phục lại lệnh chỉ thị bị ghi đè ở bên trên    ret                     ; quay trở lại code chính; Kết thúc code cavemessage:    db      "Hello world", 0

Sau khi làm thế xong, khi chạy chương trình thì màn hình dòng lệnh sẽ hiện ra dòng chữ "Injected" trước, sau đó mới là "Hello world".